//
//  main.swift
//  @escaping
//
//  Created by 左忠飞 on 2021/8/11.
//

import Foundation

//Swift 中我们可以定义一个接受函数作为参数的函数，而在调用时，使用闭包的方式来传递这个参 数是常⻅手段:
func doWork(block:()->()){
    block()
}

doWork {
    print("work")
}

//这种最简单的闭包其实还隐藏了一个假设,那就是参数中的block会在doWork函数返回前完成,也就是说,对于block的调用是同步行为


//如果改变一下代码,将block放到一个Dispatch中,让它在函数返回后调用的话,就需要在block的类型前边加上 @escaping ,标记这个闭包会逃逸出该方法
func doWorkAsync(block: @escaping ()->()){
    DispatchQueue.main.async {
        block()
    }
}

doWorkAsync {
    print("async work")
}

class S {
    var foo = "foo"
    
    func method1() {
        doWork {
            print(foo)
        }
        foo = "bar"
    }
    
    func method2() {
        doWorkAsync {
            print(self.foo)
        }
    }
}

S().method1()
S().method2()
